package com.zhoug.common.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

/**
 * @Author 35574
 * @Date 2022/4/20
 * @Description
 */
public class GsonUtils {
    /**
     * 用来判断json为null
     *
     * @param jsonElement
     * @return
     */
    public static boolean isNonNull(JsonElement jsonElement) {
        return jsonElement != null && !jsonElement.isJsonNull();
    }

    public static JsonObject getAsJsonObject(JsonObject jsonObject, String key) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsJsonObject();
            }
        }
        return null;
    }

    public static String getAsString(JsonObject jsonObject, String key) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsString();
            }
        }
        return null;
    }

    public static boolean getAsBoolean(JsonObject jsonObject, String key, boolean def) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsBoolean();
            }
        }
        return def;
    }

    public static double getAsDouble(JsonObject jsonObject, String key, double def) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsDouble();
            }
        }
        return def;
    }

    public static float getAsFloat(JsonObject jsonObject, String key, float def) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsFloat();
            }
        }
        return def;
    }

    public static int getAsInt(JsonObject jsonObject, String key, int def) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsInt();
            }
        }
        return def;
    }

    public static long getAsLong(JsonObject jsonObject, String key, long def) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (isNonNull(jsonElement)) {
                return jsonElement.getAsLong();
            }
        }
        return def;
    }

    public static String toJson(Object obj) {
        return new Gson().toJson(obj);
    }

    /**
     * 序列化”=”转化成”\u003d”的问题
     *
     * @param obj
     * @return
     */
    public static String toJsonDisableHtmlEscaping(Object obj) {
        return new Gson().newBuilder().disableHtmlEscaping().create().toJson(obj);
    }


    public static String toJsonWithoutExpose(Object obj) {
        return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(obj);
    }

    public static <T> T fromJson(String json, Class<T> cls) {
        if (json == null) {
            return null;
        }
        return new Gson().fromJson(json, cls);
    }

    public static <T> T fromJson(Object json, Class<T> cls) {
        if (json == null) {
            return null;
        }
        return new Gson().fromJson(json.toString(), cls);
    }

    public static <T> List<T> fromJsonList(Object json, TypeToken<List<T>> typeToken) {
        if (json == null) {
            return null;
        }
        return new Gson().fromJson(json.toString(), typeToken.getType());
    }

    public static <T> List<T> fromJsonList(Object json, Type type) {
        if (json == null) {
            return null;
        }
        return new Gson().fromJson(json.toString(), type);
    }


}
